import logging
import os
from datetime import datetime
import time

# 全局变量
is_initialized = False  # 是否已初始化
logger = None  # 日志记录器实例
file_handler = None  # 文件处理器
console_handler = None  # 控制台处理器，初始为None


def chatAiLogInit(filename):
    """
    初始化日志模块，创建日志文件和处理器，仅需调用一次。

    参数:
        filename (str): 日志文件路径。
    """
    global is_initialized, logger, file_handler

    if is_initialized:
        return  # 已初始化则直接返回

    # 创建日志记录器
    logger = logging.getLogger('chat_ai_logger')
    logger.setLevel(logging.DEBUG)  # 设置最低日志级别，由处理器决定实际记录级别

    # 确保日志文件目录存在
    log_dir = os.path.dirname(filename)
    if log_dir:  # 非空目录路径
        os.makedirs(log_dir, exist_ok=True)

    # 创建文件处理器，以追加模式写入
    file_handler = logging.FileHandler(filename, encoding='utf-8')
    file_handler.setLevel(logging.DEBUG)  # 文件记录所有级别日志

    # 定义日志格式：[时间戳][level][msg]，时间精确到毫秒
    formatter = logging.Formatter(
        '[%(asctime)s.%(msecs)03d][%(levelname)s][%(message)s]',
        datefmt='%Y-%m-%d %H:%M:%S'
    )
    file_handler.setFormatter(formatter)

    logger.addHandler(file_handler)
    logger.propagate = False  # 防止传播到根记录器

    is_initialized = True


def chatAiLog(level, msg):
    """
    记录日志信息

    参数:
        level (str): 日志级别（如'DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'）
        msg (str): 日志消息
    """
    global logger, is_initialized

    if not is_initialized:
        raise RuntimeError("日志模块未初始化，请先调用chatAiLogInit()")

    # 将级别字符串转换为logging的级别常量
    level_upper = level.upper()
    level_num = getattr(logging, level_upper, None)

    if not isinstance(level_num, int):
        raise ValueError(f"无效的日志级别: {level}")

    # 记录日志
    logger.log(level_num, msg)


def chatAiLogEnable(enable):
    """
    启用或禁用控制台日志输出

    参数:
        enable (bool): 是否输出到控制台
    """
    global logger, is_initialized, console_handler

    if not is_initialized:
        raise RuntimeError("日志模块未初始化，请先调用chatAiLogInit()")

    if enable:
        if console_handler is None:
            # 创建控制台处理器并添加到记录器
            console_handler = logging.StreamHandler()
            formatter = logging.Formatter(
                '[%(asctime)s.%(msecs)03d][%(levelname)s][%(message)s]',
                datefmt='%Y-%m-%d %H:%M:%S'
            )
            console_handler.setFormatter(formatter)
            logger.addHandler(console_handler)
    else:
        if console_handler is not None:
            # 移除控制台处理器并清理
            logger.removeHandler(console_handler)
            console_handler.close()
            console_handler = None
'''
请注意你是我的编程助手，现在我需要你帮我实现一个日志模块，日志模块的 要求如下：
1、该模块有三个函数chatAiLogInit(filname), chatAiLog(level ，msg) chatAiLogEnable(boolean);
2、chatAiLogInit(filname)日志初始化函数， 参数为日志存储路径，如果诶之文件不存在则创建该文件，如果日志文件存在则已追加的方式写日志，
文件是全局的，被初始化一次后，后面就不需要被初始化了；
3、chatAiLog(level ，msg)，写日志函数， 第一个参数为日志等级，类型为字符串， 第二个参数为日志消息， 类型为字符串，记录日志的格式为
[时间戳][level][msg], 其中时间戳要求精确到毫秒。
4、chatAiLogEnable(boolean)，该函数主要控制日志是否需要输出到控制台；
5、请用Python 实现 并加上注释。
'''
if __name__ == "__main__":
    # 初始化日志（仅在程序启动时调用一次）
    chatAiLogInit("logs/app.log")

    # 启用控制台输出
    chatAiLogEnable(True)

    # 记录不同级别的日志
    chatAiLog("INFO", "这是一条信息日志")
    chatAiLog("ERROR", "发生了一个错误")

    # 关闭控制台输出
    chatAiLogEnable(False)
    chatAiLog("DEBUG", "这条日志不会出现在控制台")